import poplib
from email.parser import Parser

# 下载邮件
# 输入项
email = input('Email: ')
password = input('password: ')
pop3_server = input('pop3 server: ')
# 连接pop3服务
server = poplib.POP3(pop3_server)
# 调试
server.set_debuglevel(1)
# 打印欢迎文字
print(server.getwelcome().decode('utf-8'))
# 身份认证
server.user(email)
server.pass_(password)
# stat()返回邮件数量和占用空间
print('messages:%s size:%s' % server.stat())
# list()返回所有邮件的编号
resp, mails, octets = server.list()
print(mails)
# 获取最新一封(索引从1开始
index = len(mails)
resp, lines, octets = server.retr(index)
# lines存储了邮件的原始文本的每一行, 可以获得整个邮件的原始文本:
msg_content = b'\r\n'.join(lines).decode('utf-8')
# 解析出邮件
msg = Parser().parsestr(msg_content)
# 可以根据索引删除文件
server.dele(index)
# 关闭连接
server.quit()

# 只需要一行代码就可以把邮件内容解析为Message对象：
# msg = Parser().parsestr(msg_content)
# 但是这个Message对象本身可能是一个MIMEMultipart对象，即包含嵌套的其他MIMEBase对象，嵌套可能还不止一层。
# 所以我们要递归地打印出Message对象的层次结构：
from email.header import decode_header
from email.utils import parseaddr


def decode_str(s):
    value, charset = decode_header(s)[0]
    if charset:
        value = value.decode(charset)
    return value


def guess_charset(msg):
    charset = msg.get_charset()
    if charset is None:
        content_type = msg.get('Content-Type', '').lower()
        pos = content_type.find('charset=')
        if pos >= 0:
            charset = content_type[pos + 8:].strip()
    return charset


def print_info(msg, indent=0):
    if indent == 0:
        for header in ['From', 'To', 'Subject']:
            value = msg.get(header, '')
            if value:
                if header == 'Subject':
                    value = decode_str(value)
                else:
                    hdr, addr = parseaddr(value)
                    name = decode_str(hdr)
                    value = u'%s<%s>' % (name, addr)
                print('%s%s:%s' % ('  ' * indent, header, value))
            if (msg.is_multipart()):
                parts = msg.get_payload()
                for n, part in enumerate(parts):
                    print('%spart %s' % ('  ' * indent, n))
                    print('%s-------------' % ('  ' * indent))
                    print_info(part, indent + 1)
            else:
                content_type = msg.get_content_type()
                if content_type == 'text/plain' or content_type == 'text/html':
                    content = msg.get_payload(decode=True)
                    charset = guess_charset(msg)
                    if charset:
                        content = content.decode(charset)
                    print('%sText: %s' % ('  ' * indent, content + '...'))
                else:
                    print('%sAttachment: %s' % ('  ' * indent, content_type))
